//
// Created by hsj on 2022/1/18.
//

#ifndef CLION_CPP_T_QUEUE_H
#define CLION_CPP_T_QUEUE_H
namespace hsj_queue{
    //测试队列
    void test_queue();

    //顾客类
    class Customer{
        private:
            long arrive;
            int processTime;
        public:
            Customer(){arrive = processTime = 0;};
            void set(long when);
            long when()const{
                return arrive;
            };
            int pTime()const{
                return processTime;
            };
    };

    //取一个别名
    typedef Customer Item;

    //队列
    class  Queue{
        private:
            //c++11枚举，避免冲突
            //默认大小
            enum class SIZE_DEFAULT: int{Q_SIZE = 10};
            //单链表
            struct Node{
                Item item;
                Node *next;
            };
            //**********************约定，不要再类原型里面初始化任何字段域，使用构造函数解决*************
            //前端第一个
            Node *front;
            //后端最后一个
            Node *rear;
            //item:总数
            int items;
            //queue:队列大小
            const int qsize;
           //***********************************************************************************

          //*********************************复制构造函数&&重载赋值不可用【小心按值传递或者按值返回：复制构造函数将被调用】**************************
           Queue(const Queue &q):qsize(0){};
           Queue& operator=(const Queue &q){return *this;};
          //*****************************************************************************************************************************
        public:
            Queue(int qs = static_cast<int>(SIZE_DEFAULT::Q_SIZE));
            ~Queue();
            bool isEmpty() const;
            bool isFull() const;
            int queueCount() const;
            //add item into queue
            bool enqQueue(const Item &item);
            //remove item from queue
            bool deQueue(Item &item);
    };
}
#endif //CLION_CPP_T_QUEUE_H
